package servidor.bbdd.subsistema1;

import beans.*;
import common.EOlympicsException;
import java.sql.*;
import java.util.Iterator;
import java.util.Locale;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import servidor.bbdd.GestorDiscoConexion;

/**
 *
 * @author Albert
 */
public class GestorSubsistema1 {
    private GestorDiscoConexion gestorBD;
    private Vector logins = new Vector();
    java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("i18n/subsistema1/messagesSubsistema1"); // NOI18N
        
    public GestorSubsistema1(GestorDiscoConexion pGestor){
        this.gestorBD = pGestor;
    }
    
    /**
     * Obtenir el usuari amb un login i un password<br>
     * Realitza el Login
     * @param login Nom d'usuari
     * @param password password de l'usuari
     * @return En cas que el login i password siguin correctes torna l'usuari. En cas contrari throw EOlympicsException
     * @throws EOlympicsException
     */
    public Usuari getLogin(String login, String password) throws EOlympicsException{
        
        System.out.println("Consulta de login"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;
        Usuari usuari=null;
        Integer idUsuari = new Integer(-1);
        char estatEnSistema = 'B';
 	try { 		
            StringBuffer query0 = new StringBuffer();
            query0.append("select *");
            query0.append(" from usuari");
            query0.append(" where idusuari = ?"); 
            st = gestorBD.getConexion().prepareStatement(query0.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            st.setString(1,login);
            rs = st.executeQuery();
            if (rs.next()) {
                idUsuari = new Integer(rs.getInt("idintern"));
                estatEnSistema = rs.getString("estatensistema").charAt(0);
            }
            
            if(idUsuari.intValue() == -1) {
                System.out.print("Usuari no trobat");
                throw new EOlympicsException(bundle.getString("client.administracio.error_usuari_no_trobat"));
                
            }else if(estatEnSistema =='B'){
                System.out.print("Usuari bloquejat");
                throw new EOlympicsException(bundle.getString("client.administracio.error_login_usuari_bloquejat"));
                
            }
            
            StringBuffer query = new StringBuffer();
                query.append("select *");
                query.append(" from usuari");
                query.append(" where idusuari = ?"); 
                query.append(" and pwd = ?");
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
 		st.setString(1,login);
                st.setString(2,password);
                rs = st.executeQuery();
 		if (rs.next()) {
                    
                    idUsuari = new Integer(rs.getInt("idintern"));
                    char tipususuari = rs.getString("tipususuari").charAt(0);
                    
                    if(tipususuari=='A'){
                        PreparedStatement st2 = null;
                        ResultSet rs2 = null;
                        StringBuffer query2 = new StringBuffer();
                        query2.append("select *");
                        query2.append(" from administrador");
                        query2.append(" where idadministrador = ?"); 
                        st2 = gestorBD.getConexion().prepareStatement(query2.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                        st2.setInt(1,idUsuari.intValue());
                        rs2 = st2.executeQuery();
 		
                        if (rs2.next()) {
                            usuari=new Administrador(new Integer(rs2.getInt("idadministrador")),
                            new Integer(rs.getInt("idintern")),
                            rs.getString("tipususuari"),
                            rs.getString("idusuari"),
                            rs.getString("pwd"),
                            rs.getString("email"),
                            rs.getString("estatensistema"),
                            rs.getString("tipusdocumentid"),
                            rs.getString("document"),
                            rs.getString("nom"),
                            rs.getString("cognom1"),
                            rs.getString("cognom2"),
                            rs.getDate("dataalta"),
                            new Integer(rs.getInt("usuarialta")),
                            rs.getDate("databaixa"),
                            new Integer(rs.getInt("usuaribaixa")),
                            rs.getDate("datamod"),
                            new Integer(rs.getInt("usuarimod")));
                        }
                    }else if(tipususuari=='R'){
                        PreparedStatement st2 = null;
                        ResultSet rs2 = null;
                        StringBuffer query2 = new StringBuffer();
                        query2.append("select *");
                        query2.append(" from responsableevents");
                        query2.append(" where idresponsable = ?"); 
                        st2 = gestorBD.getConexion().prepareStatement(query2.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                        st2.setInt(1,idUsuari.intValue());
                        rs2 = st2.executeQuery();
 		
                        if (rs2.next()) {
                            usuari=new ResponsableEvents(
                            new Integer(rs2.getInt("idresponsable")),
                            new Integer(rs.getInt("idintern")),
                            rs.getString("tipususuari"),
                            rs.getString("idusuari"),
                            rs.getString("pwd"),
                            rs.getString("email"),
                            rs.getString("estatensistema"),
                            rs.getString("tipusdocumentid"),
                            rs.getString("document"),
                            rs.getString("nom"),
                            rs.getString("cognom1"),
                            rs.getString("cognom2"),
                            rs.getDate("dataalta"),
                            new Integer(rs.getInt("usuarialta")),
                            rs.getDate("databaixa"),
                            new Integer(rs.getInt("usuaribaixa")),
                            rs.getDate("datamod"),
                            new Integer(rs.getInt("usuarimod")));
                        }
                    }else if(tipususuari=='E'){
                        PreparedStatement st2 = null;
                        ResultSet rs2 = null;
                        StringBuffer query2 = new StringBuffer();
                        query2.append("select *");
                        query2.append(" from estudiant");
                        query2.append(" where idestudiant = ?"); 
                        st2 = gestorBD.getConexion().prepareStatement(query2.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                        st2.setInt(1,idUsuari.intValue());
                        rs2 = st2.executeQuery();
 		
                        if (rs2.next()) {
                            usuari=new Estudiant(new Integer(rs2.getInt("idestudiant")),
                                    rs2.getString("universitat"), new Integer(rs.getInt("idintern")),
                                    rs.getString("tipususuari"), rs.getString("idusuari"),
                                    rs.getString("pwd"), rs.getString("email"),
                                    rs.getString("estatensistema"), rs.getString("tipusdocumentid"),
                                    rs.getString("document"), rs.getString("nom"),
                                    rs.getString("cognom1"), rs.getString("cognom2"),
                                    rs.getDate("dataalta"), new Integer(rs.getInt("usuarialta")),
                                    rs.getDate("databaixa"), new Integer(rs.getInt("usuaribaixa")),
                                    rs.getDate("datamod"), new Integer(rs.getInt("usuarimod")));
                        }
                    }
                         
 		}
                
                rs.close();
                st.close();
                        
                if(usuari==null){
                    logins.add(login);
                    int numLogins = 0;
                    Iterator<String> it = logins.iterator();
                    while(it.hasNext()){
                        String log = it.next();
                        if(log.equals(login)) numLogins++;
                    }
                    
                    if(numLogins < 5){
                        throw new EOlympicsException(bundle.getString("client.administracio.error_password_incorrecte")+" "+(5-numLogins)+" "+bundle.getString("client.administracio.error_intents"));
                    }else{
                        bloquejarUsuari(idUsuari.intValue());
                        throw new EOlympicsException(bundle.getString("client.administracio.error_usuari_bloquejat"));
                    }
                }

                while(logins.contains(login)){
                    logins.removeElement(login);
                }
                
                return usuari;
                
                
 	}catch (EOlympicsException e){
            System.out.println("Excepció EOlympics");
 		throw e;
        }catch (SQLException e) {
            System.out.println("Excepció login");
 		throw new EOlympicsException(bundle.getString("client.administracio.error_consulta_sql"));
 	}finally{
            try {
                rs.close();
                st.close();
                rs = null;
                st = null;
            } catch (SQLException ex) {
                
            }   
        }
 	
        
    }
    
    /**
     * Bloqueja l'usuari
     * @param idIntern id intern de l'usuari a bloquejar
     * @throws EOlympicsException
     */
    public void bloquejarUsuari(int idIntern) throws EOlympicsException{
        System.out.println("Bloquejant usuari"); 		
 	PreparedStatement st = null;
        try { 		
            StringBuffer query0 = new StringBuffer();
            query0.append("update usuari set");
            query0.append(" estatensistema = 'B'");
            query0.append(" where idintern = ?"); 
            st = gestorBD.getConexion().prepareStatement(query0.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            st.setInt(1,idIntern);
            st.executeUpdate();
                
 	}catch (SQLException e) {
            //e.printStackTrace();
            System.out.println("Excepció bloquejar");
            throw new EOlympicsException(bundle.getString("client.administracio.error_consulta_sql"));
 	}finally{
            try {
                st.close();
                st = null;
            } catch (SQLException ex) {
                
            }
        }
    }
    
    /**
     * Donar tota la informació completa d'un usuari concret a partir del seu id intern
     * @param idIntern Id intern de l'usuari
     * @return Retorna l'usuari consultat. En cas d'error o si l'usuari no s'ha trobat, torna null
     */
    public Usuari getUser(int idIntern){
        
        System.out.println("Consulta de login"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;
        Usuari usuari=null;
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append("select *");
                query.append(" from usuari");
                query.append(" where idintern = ?"); 
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
 		st.setInt(1,idIntern);
                rs = st.executeQuery();
 		if (rs.next()) {
                    
                    int idUsuari = rs.getInt("idintern");
                    char tipususuari = rs.getString("tipususuari").charAt(0);
                    
                    if(tipususuari=='A'){
                        PreparedStatement st2 = null;
                        ResultSet rs2 = null;
                        StringBuffer query2 = new StringBuffer();
                        query2.append("select *");
                        query2.append(" from administrador");
                        query2.append(" where idadministrador = ?"); 
                        st2 = gestorBD.getConexion().prepareStatement(query2.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                        st2.setInt(1,idUsuari);
                        rs2 = st2.executeQuery();
 		
                        if (rs2.next()) {
                            usuari=new Administrador(new Integer(rs2.getInt("idadministrador")),new Integer(rs.getInt("idintern")),
                            rs.getString("tipususuari"), rs.getString("idusuari"), rs.getString("pwd"), rs.getString("email"),
                                    rs.getString("estatensistema"), rs.getString("tipusdocumentid"), rs.getString("document"),
                                    rs.getString("nom"), rs.getString("cognom1"), rs.getString("cognom2"), rs.getDate("dataalta"),
                                    new Integer(rs.getInt("usuarialta")), rs.getDate("databaixa"), new Integer(rs.getInt("usuaribaixa")),
                                    rs.getDate("datamod"), new Integer(rs.getInt("usuarimod")));
                        }
                    }else if(tipususuari=='R'){
                        PreparedStatement st2 = null;
                        ResultSet rs2 = null;
                        StringBuffer query2 = new StringBuffer();
                        query2.append("select *");
                        query2.append(" from responsableevents");
                        query2.append(" where idresponsable = ?"); 
                        st2 = gestorBD.getConexion().prepareStatement(query2.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                        st2.setInt(1,idUsuari);
                        rs2 = st2.executeQuery();
 		
                        if (rs2.next()) {
                            usuari=new ResponsableEvents(new Integer(rs2.getInt("idresponsable")),new Integer(rs.getInt("idintern")),
                                    rs.getString("tipususuari"), rs.getString("idusuari"), rs.getString("pwd"), rs.getString("email"),
                                    rs.getString("estatensistema"),
                                    rs.getString("tipusdocumentid"), rs.getString("document"), rs.getString("nom"), rs.getString("cognom1"),
                                    rs.getString("cognom2"), rs.getDate("dataalta"), new Integer(rs.getInt("usuarialta")), rs.getDate("databaixa"),
                                    new Integer(rs.getInt("usuaribaixa")), rs.getDate("datamod"), new Integer(rs.getInt("usuarimod")));
                        }
                    }else if(tipususuari=='E'){
                        PreparedStatement st2 = null;
                        ResultSet rs2 = null;
                        StringBuffer query2 = new StringBuffer();
                        query2.append("select *");
                        query2.append(" from estudiant");
                        query2.append(" where idestudiant = ?"); 
                        st2 = gestorBD.getConexion().prepareStatement(query2.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                        st2.setInt(1,idUsuari);
                        rs2 = st2.executeQuery();
 		
                        if (rs2.next()) {
                            usuari=new Estudiant(new Integer(rs2.getInt("idestudiant")),
                                    rs2.getString("universitat"),new Integer(rs.getInt("idintern")),
                                    rs.getString("tipususuari"), rs.getString("idusuari"),
                                    rs.getString("pwd"), rs.getString("email"),
                                    rs.getString("estatensistema"), rs.getString("tipusdocumentid"),
                                    rs.getString("document"), rs.getString("nom"),
                                    rs.getString("cognom1"), rs.getString("cognom2"),
                                    rs.getDate("dataalta"), new Integer(rs.getInt("usuarialta")),
                                    rs.getDate("databaixa"), new Integer(rs.getInt("usuaribaixa")),
                                    rs.getDate("datamod"), new Integer(rs.getInt("usuarimod")));
                        }
                    }
                         
 		}
 	}catch (SQLException e) {
                System.out.println("Excepció SQL");
 		e.printStackTrace();
                return null;
 	}
 	finally{
 		try{
 			rs.close();
 			st.close();
                        rs = null;
                        st = null;
                        return usuari;
 		
                }catch(Exception e){
 			e.printStackTrace();
                        return null;
 		}
 	}
        
    }
    
    /**
     * Realitza una búsqueda d'usuaris segons el paràmetres passats.<br>
     * Els paràmetres no són excluients, és a dir, han de coincidir tots en un usuari.<br>
     * En cas de deixar un camp buit, serà com si no es tingués en compte.
     * @param idIntern Id intern de l'usuari
     * @param nom nom de l'usuari
     * @param cognom1 cognom1 de l'usuari
     * @param cognom2 cognom2 de l'usuari
     * @return Retorna un vector amb tots els usuaris, o un vector buit en cas de no trobar usuaris que coincideixin. <br>En cas d'error torna null.
     */
    public Vector getBusqueda(int idIntern, String nom, String cognom1, String cognom2){
        Vector llista = new Vector();
        
        System.out.println("Consulta de busqueda"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append("select idintern,nom,cognom1,cognom2");
                query.append(" from usuari");
                query.append(" where");
                query.append(" lower(nom) like '%"+nom.toLowerCase() +"%'"); 
                query.append(" and lower(cognom1) like '%"+cognom1.toLowerCase()+"%'"); 
                query.append(" and lower(cognom2) like '%"+cognom2.toLowerCase()+"%'");
                if(idIntern!=0){
                    query.append(" and idintern = "+idIntern); 
                }
                query.append(" order by nom");
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
 		rs = st.executeQuery();
 		while (rs.next()) {
                    
                    Usuari user = new Usuari();
                    user.setIdIntern(new Integer(rs.getInt("idintern")));
                    user.setNom(rs.getString("nom"));
                    user.setCognom1(rs.getString("cognom1"));
                    user.setCognom2(rs.getString("cognom2"));
                    llista.add(user);
                         
 		}
                
                return llista;

 	}catch (EOlympicsException e) {
                System.out.println("Excepció busqueda");
 		//e.printStackTrace();
                return null;

 	}catch (SQLException e) {
                System.out.println("Excepció busqueda");
 		//e.printStackTrace();
                return null;
 	}
 	finally{
 		try{
 			rs.close();
 			st.close();
                        rs = null;
                        st = null;
 		
                }catch(Exception e){
 			//e.printStackTrace();
                        //return null;
 		}
 	}
    }
    
    /**
     * Afageix un usuari a la base de dades
     * @param usuariAdministrador Id intern de l'administrador que afegeix l'usuari
     * @param tipusUsuari tipus d'usuari del nou usuari
     * @param idUsuari id del usuari del nou usuari
     * @param pwd password del nou usuari
     * @param email email del nou usuari
     * @param estatEnSistema estat en el sistema del nou usuari
     * @param tipusDocumentId tipus de document del nou usuari
     * @param document document del nou usuari
     * @param nom nom del nou usuari
     * @param cognom1 primer cognom del nou usuari
     * @param cognom2 segon cognom del nou usuari
     * @param universitat en cas de ser un estudiant, el nom de l'universitat de l'estudiant
     * @return Retorna el id del nou usuari. En cas d'error throws una EOlympicsException
     * @throws EOlympicsException
     */
    public Integer addUser(int usuariAdministrador, char tipusUsuari, String idUsuari, String pwd, String email, char estatEnSistema, String tipusDocumentId, String document, String nom, String cognom1, String cognom2, String universitat) throws EOlympicsException{
        Integer idInserted = new Integer(0);
        
        java.util.Date today = new java.util.Date();
        java.sql.Date sqlToday = new java.sql.Date(today.getTime());

        System.out.println("Creant nou usuari"); 		
 	Statement st = null;
 	ResultSet rs = null;
        PreparedStatement pst = null;
 	ResultSet prs = null;
 	try { 	
            
            StringBuffer query0 = new StringBuffer();
            query0.append("select *");
            query0.append(" from usuari");
            query0.append(" where idusuari = ?"); 
            query0.append(" or email = ?"); 
            pst = gestorBD.getConexion().prepareStatement(query0.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            pst.setString(1,idUsuari);
            pst.setString(2,email);
            prs = pst.executeQuery();
            if (prs.next()) {
                String rlogin = prs.getString("idusuari");
                String remail = prs.getString("email");
                if(rlogin.equals(idUsuari)){
                    System.out.print("idUsuari ja existeix");
                    throw new EOlympicsException(bundle.getString("client.administracio.error_usuari_ja_existeix"));
                
                }else if(remail.equals(email)){
                    System.out.print("Email ja existeix");
                    throw new EOlympicsException(bundle.getString("client.administracio.error_email_ja_existeix"));
                
                }
            }
            
            pst.close();
            prs.close();
            
 		StringBuffer query = new StringBuffer();
                query.append("insert into usuari");
                query.append("(tipususuari,idusuari,pwd,email,estatensistema,tipusdocumentid,document,nom,cognom1,cognom2,dataalta,usuarialta)");
                query.append(" values('"+String.valueOf(tipusUsuari)+"',");
                query.append("'"+idUsuari+"',");
                query.append("'"+pwd+"',");
                query.append("'"+email+"',");
                query.append("'"+String.valueOf(estatEnSistema)+"',");
                query.append("'"+tipusDocumentId+"',");
                query.append("'"+document+"',");
                query.append("'"+nom+"',");
                query.append("'"+cognom1+"',");
                query.append("'"+cognom2+"',");
                query.append("'"+sqlToday+"',");
                query.append("'"+usuariAdministrador+"')");
 		st = gestorBD.getConexion().createStatement();
                
                st.execute(query.toString(), Statement.RETURN_GENERATED_KEYS);
                
                rs = st.getGeneratedKeys();
 		if (rs.next()) {
                    
                    idInserted = new Integer(rs.getInt(1));
                    System.out.print("Id inserted: "+idInserted);
                    
                    rs.close();
                    st.close();
                    
                    if(tipusUsuari=='A'){
                        query = new StringBuffer();
                        query.append("insert into administrador");
                        query.append("(idadministrador)");
                        query.append(" values("+idInserted+")");
                        st = gestorBD.getConexion().createStatement();
                        
                    }else if(tipusUsuari=='R'){
                        query = new StringBuffer();
                        query.append("insert into responsableevents");
                        query.append("(idresponsable)");
                        query.append(" values("+idInserted+")");
                        st = gestorBD.getConexion().createStatement();
                        
                    }else if(tipusUsuari=='E'){
                        query = new StringBuffer();
                        query.append("insert into estudiant");
                        query.append("(idestudiant,universitat)");
                        query.append(" values("+idInserted+",'"+universitat+"')");
                        st = gestorBD.getConexion().createStatement();
                        
                    }
                    if(st!=null){
                        st.execute(query.toString());
                    }
                         
 		}
                
                
                st.close();

                return idInserted;
                
 	}catch (EOlympicsException e) {
                System.out.println("EOplympics Exception");
 		throw e;
 	}catch (SQLException e) {
                System.out.println("Excepció SQL");
 		throw new EOlympicsException(bundle.getString("client.administracio.error_consulta_sql"));
 	}
 	finally{
 		try{
                    st.close();
                    rs.close();
                }catch(Exception e){
               
                }
 	}
    }
    
    /**
     * Modifica o dona de baixa un usuari a la base de dades 
     * @param usuariAdministrador Id intern de l'administrador que modifica l'usuari o el dona de baixa
     * @param idIntern id intern de l'usuari
     * @param tipusUsuari tipus d'usuari de l'usuari
     * @param idUsuari id del usuari de l'usuari
     * @param pwd password de l'usuari
     * @param email email de l'usuari
     * @param estatEnSistema estat en el sistema de l'usuari
     * @param tipusDocumentId tipus de document de l'usuari
     * @param document document de l'usuari
     * @param nom nom de l'usuari
     * @param cognom1 primer cognom de l'usuari
     * @param cognom2 segon cognom de l'usuari
     * @param universitat en cas de ser un estudiant, el nom de l'universitat de l'estudiant
     * @param isBaixa en cas que l'usuari passi de estat A a B, aquest valor ha de ser true
     * @return Retorna el true en cas d'éxit o false en cas contrari
     * @throws EOlympicsException
     */
    public boolean updateUser(int usuariAdministrador, int idIntern, char tipusUsuari, String idUsuari, String pwd, String email, char estatEnSistema, String tipusDocumentId, String document, String nom, String cognom1, String cognom2, String universitat, boolean isBaixa) throws EOlympicsException{
        boolean totOk = false;
        
        java.util.Date today = new java.util.Date();
        java.sql.Date sqlToday = new java.sql.Date(today.getTime());

        System.out.println("Modificant usuari"); 		
 	Statement st = null;
        PreparedStatement pst = null;
 	ResultSet prs = null;
 	try { 
            
            StringBuffer query0 = new StringBuffer();
            query0.append("select *");
            query0.append(" from usuari");
            query0.append(" where (idusuari = ?"); 
            query0.append(" or email = ?)"); 
            query0.append(" and idintern <> ?"); 
            pst = gestorBD.getConexion().prepareStatement(query0.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            pst.setString(1,idUsuari);
            pst.setString(2,email);
            pst.setInt(3,idIntern);
            prs = pst.executeQuery();
            if (prs.next()) {
                String rlogin = prs.getString("idusuari");
                String remail = prs.getString("email");
                if(rlogin.equals(idUsuari)){
                    System.out.print("idUsuari ja existeix");
                    throw new EOlympicsException(bundle.getString("client.administracio.error_usuari_ja_existeix"));
                
                }else if(remail.equals(email)){
                    System.out.print("Email ja existeix");
                    throw new EOlympicsException(bundle.getString("client.administracio.error_email_ja_existeix"));
                
                }
            }
            
            pst.close();
            prs.close();
            
 		StringBuffer query = new StringBuffer();
                query.append("update usuari set");
                query.append(" tipususuari = '"+String.valueOf(tipusUsuari)+"',");
                query.append(" idusuari = '"+idUsuari+"',");
                query.append(" pwd = '"+pwd+"',");
                query.append(" email = '"+email+"',");
                query.append(" estatensistema = '"+String.valueOf(estatEnSistema)+"',");
                query.append(" tipusdocumentid = '"+tipusDocumentId+"',");
                query.append(" document = '"+document+"',");
                query.append(" nom = '"+nom+"',");
                query.append(" cognom1 = '"+cognom1+"',");
                query.append(" cognom2 = '"+cognom2+"',");
                query.append(" datamod = '"+sqlToday+"',");
                query.append(" usuarimod = "+usuariAdministrador);
                if(estatEnSistema == 'B' && isBaixa){
                    query.append(", databaixa = '"+sqlToday+"',");
                    query.append(" usuaribaixa = "+usuariAdministrador);
                }else if(estatEnSistema == 'A'){
                    query.append(", databaixa = NULL,");
                    query.append(" usuaribaixa = NULL");
                }
                query.append(" where idintern = "+idIntern);
 		st = gestorBD.getConexion().createStatement();
                
                st.execute(query.toString(), Statement.RETURN_GENERATED_KEYS);
                
                st.close();
                st = null;
                
                if(tipusUsuari=='E'){
                    query = new StringBuffer();
                    query.append("update estudiant");
                    query.append(" set universitat = '"+universitat+"' where idestudiant = "+idIntern);
                    st = gestorBD.getConexion().createStatement();

                }
                if(st!=null){
                    st.execute(query.toString());
                }
                
                st.close();

                return true;
                
 	}catch (EOlympicsException e) {
                System.out.println("EOplympics Exception");
 		throw e;
 	}catch (SQLException e) {
                System.out.println("Excepció SQL");
                throw new EOlympicsException(bundle.getString("client.administracio.error_consulta_sql"));
 	}
 	finally{
 		try{
                    
                    st.close();
 		
                }catch(Exception e){
                    
 		}
 	}
    }
    
    /**
     * Elimina un usuari a la base de dades 
     * @param idIntern id intern de l'usuari
     * @param tipusUsuari tipus d'usuari de l'usuari
     * @return Retorna el true en cas d'éxit o false en cas contrari
     */
    public boolean deleteUser(int idIntern, char tipusUsuari){
        boolean totOk = false;
        
        System.out.println("Eliminant usuari"); 		
 	Statement st = null;
 	try { 		
            StringBuffer query = new StringBuffer();
                
            if(tipusUsuari=='A'){
                query.append("delete from administrador where idadministrador = "+idIntern);
            }else if(tipusUsuari=='R'){
                query.append("delete from responsableevents where idresponsable = "+idIntern);
            }else if(tipusUsuari=='E'){
                query.append("delete from estudiant where idestudiant = "+idIntern);
            }
            st = gestorBD.getConexion().createStatement();

            st.execute(query.toString(), Statement.RETURN_GENERATED_KEYS);

            st.close();
            st = null;

            query = new StringBuffer();
            query.append("delete from usuari where idintern = "+idIntern);
            st = gestorBD.getConexion().createStatement();

            st.execute(query.toString());
              

            st.close();
            return true;

     }catch (EOlympicsException e) {
            System.out.println("Excepció update");
            return false;

 	}catch (SQLException e) {
            System.out.println("Excepció update");
            return false;
 	}
 	finally{
            try{
                    st.close();
                    st = null;
            }catch(Exception e){
                
            }
 	}
    }
    
    /**
     * Torna un vector amb les inscripcions d'un usuari 
     * @param idIntern id intern de l'usuari
     * @return Retorna el vector en cas d'éxit, o null en cas contrari
     */
    public Vector getInscripcions(int idIntern){
        
        Vector llista = new Vector();
        
        System.out.println("Consulta de inscripcions"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append("select *");
                query.append(" from inscripcio");
                query.append(" where");
                query.append(" idestudiant="+idIntern); 
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
 		rs = st.executeQuery();
 		while (rs.next()) {
                    
                    Inscripcio inscripcio = new Inscripcio(new Integer(rs.getInt("idprova")),
                            new Integer(rs.getInt("idestudiant")), rs.getDate("datainscripcio"));
                    llista.add(inscripcio);
                         
 		}
 	}catch (SQLException e) {
                System.out.println("Excepció busqueda");
 		e.printStackTrace();
                return null;
 	}
 	finally{
 		try{
 			rs.close();
 			st.close();
                        rs = null;
                        st = null;
                        return llista;
 		
                }catch(Exception e){
 			e.printStackTrace();
                        return null;
 		}
 	}
        
    }
    
    /**
     * Torna un vector amb les proves on l'usuari té inscripcions 
     * @param idIntern id intern de l'usuari
     * @return Retorna el vector en cas d'éxit, o null en cas contrari
     */
    public Vector getProves(int idIntern){
        
        Vector llista = new Vector();
        
        System.out.println("Consulta de proves"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append("select *");
                query.append(" from prova");
                query.append(" where");
                query.append(" idprova in (select idprova from inscripcio where idestudiant="+idIntern+")");
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
 		rs = st.executeQuery();
 		while (rs.next()) {
                    
                    Prova prova = new Prova();
                    prova.setIdProva(new Integer(rs.getInt("idprova")));
                    prova.setDescripcio(rs.getString("descripcio"));
                    prova.setEstat(rs.getString("estat"));
                    llista.add(prova);
                         
 		}
 	}catch (SQLException e) {
                System.out.println("Excepció busqueda");
 		e.printStackTrace();
                return null;
 	}
 	finally{
 		try{
 			rs.close();
 			st.close();
                        rs = null;
                        st = null;
                        return llista;
 		
                }catch(Exception e){
 			e.printStackTrace();
                        return null;
 		}
 	}
        
    }
    
    /**
     * Torna un vector amb les rondes de les proves on l'usuari té inscripcions 
     * @param idIntern id intern de l'usuari
     * @return Retorna el vector en cas d'éxit, o null en cas contrari
     */
    public Vector getRondes(int idIntern){
        
        Vector llista = new Vector();
        
        System.out.println("Consulta de rondes"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append("select idprova,tipusronda,datainicirealitzacio from ronda");
                query.append(" where idprova in (");
                query.append("select idprova");
                query.append(" from prova");
                query.append(" where");
                query.append(" idprova in (select idprova from inscripcio where idestudiant="+idIntern+"))");
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
 		rs = st.executeQuery();
 		while (rs.next()) {
                    
                    Ronda ronda = new Ronda();
                    ronda.setIdProva(new Integer(rs.getInt("idprova")));
                    ronda.setTipusRonda(rs.getString("tipusronda"));
                    ronda.setDataIniciRealitzacio(rs.getDate("datainicirealitzacio"));
                    llista.add(ronda);
                         
 		}
 	}catch (SQLException e) {
                System.out.println("Excepció busqueda");
 		e.printStackTrace();
                return null;
 	}
 	finally{
 		try{
 			rs.close();
 			st.close();
                        rs = null;
                        st = null;
                        return llista;
 		
                }catch(Exception e){
 			e.printStackTrace();
                        return null;
 		}
 	}
        
    }
    
    /**
     * Torna un vector amb les participacions d'un usuari 
     * @param idIntern id intern de l'usuari
     * @return Retorna el vector en cas d'éxit, o null en cas contrari
     */
    public Vector getParticipacions(int idIntern){
        
        Vector llista = new Vector();
        
        System.out.println("Consulta de participacions"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append("select idprova,tipusronda,dataparticipacio from participacio");
                query.append(" where idestudiant = "+idIntern);
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
 		rs = st.executeQuery();
 		while (rs.next()) {
                    
                    Participacio participacio = new Participacio();
                    participacio.setIdProva(new Integer(rs.getInt("idprova")));
                    participacio.setTipusRonda(rs.getString("tipusronda"));
                    participacio.setDataParticipacio(rs.getDate("dataparticipacio"));
                    llista.add(participacio);
                         
 		}
 	}catch (SQLException e) {
                System.out.println("Excepció busqueda");
 		e.printStackTrace();
                return null;
 	}
 	finally{
 		try{
 			rs.close();
 			st.close();
                        rs = null;
                        st = null;
                        return llista;
 		
                }catch(Exception e){
 			e.printStackTrace();
                        return null;
 		}
 	}
        
    }
}
